package com.example.demo.controller;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.common.CommonEnum;
import com.example.demo.common.JsonResult;
import com.example.demo.dto.AddRequestDto;
import com.example.demo.dto.DeleteResponseDto;
import com.example.demo.dto.DetailRequestDto;
import com.example.demo.dto.DetailResponseDto;
import com.example.demo.dto.EditRequestDto;
import com.example.demo.dto.InfoRequestDto;
import com.example.demo.dto.InfoResponseDto;
import com.example.demo.service.AuthorityService;

/**
 * 権限管理
 */
@CrossOrigin
@RestController
public class AuthorityController {

    Logger logger = LoggerFactory.getLogger(AuthorityController.class);

    @Resource
    private AuthorityService authorityService;

    /**
     * 権限情報を削除する
     *
     * @param 条件を削除しますauthorityCode，deletionFlag
     * @return JsonResult
     */
    @RequestMapping(value = "/bff/authority/delete", method = RequestMethod.DELETE)
    public JsonResult authorityRemoval(@RequestParam String authorityCode, boolean deletionFlag) {
        DeleteResponseDto permissionRemoval = authorityService.authorityRemoval(authorityCode, deletionFlag);
        //削除結果を判断します
        if (permissionRemoval.getProcessingResult() == "1") {
            //削除に成功しました
            return JsonResult.success(permissionRemoval);
        } else {
            //削除に失敗しました
            return JsonResult.error(CommonEnum.BUSINESS_ERROR.getResultCode());
        }

    }

    /**
     * 権限情報一覧
     *
     * @param requestDto
     * @return JsonResult
     */
    @RequestMapping(value = "/bff/authority/info", method = RequestMethod.GET)
    public JsonResult authorityInfo(@RequestBody InfoRequestDto inforequestDto) {

        //データが空かどうかを判断します
        if (inforequestDto.getAuthorityCode() == null) {
            //null のエラーを報告します
            return JsonResult.error(CommonEnum.BUSINESS_ERROR.getResultCode());
        } else {
            InfoResponseDto infoResponseDto = authorityService.authorityInfo(inforequestDto);
            //null に成功しません
            return JsonResult.success(infoResponseDto);
        }

    }


    /**
     * 権限情報を編集する
     *
     * @param requestDto
     * @return
     */
    @RequestMapping(value = "/bff/authority/edit", method = RequestMethod.PUT)
    public JsonResult edit(@RequestBody EditRequestDto requestDto) {
        Integer result = authorityService.select(requestDto);
        // 従業員が存在するかどうかを判断します
        if (result == 0) {
            // 0 を返すものは存在しません
            return JsonResult.error(result);
        } else {
            // 従業員情報が存在し、変更されます
            Integer code = authorityService.updateAuthority(requestDto);
            if (code == 0) {
                return JsonResult.success(code);
            } else {
                return JsonResult.error(code);
            }
        }
    }

    /**
     * 権限情報詳細
     *
     * @param requestDto
     * @return JsonResult
     */
    @RequestMapping(value = "/bff/authority/detail", method = RequestMethod.POST)
    public JsonResult detail(@RequestBody DetailRequestDto requestDto) {

        // 詳細情報がnullであるかどうかを判断する
        if (requestDto.getAuthorityCode() == null) {
            // 詳細情報がnullであるかどうかを判断する
            return JsonResult.error(CommonEnum.BUSINESS_ERROR.getResultCode());
        }
        // 詳細なインテリジェンス データは null ではありません
        DetailResponseDto responseDto = authorityService.detail(requestDto);
        return JsonResult.success(responseDto);

    }

    /**
     * 権限情報を追加する
     *
     * @param addRequestDto
     * @return JsonResult
     */
    @PostMapping("/bff/authority/add")
    public JsonResult addAuthority(@RequestBody AddRequestDto addRequestDto) {

        // パラメータチェック
        if (addRequestDto.getAuthorityCode() == null)

        // で追加失敗の場合
        return JsonResult.error(CommonEnum.PARAM_NOT_MATCH.getResultCode());

        // 権限情報を追加する
        Integer result = authorityService.add(addRequestDto);

        // で追加成功の場合
        return JsonResult.success(String.valueOf(result));
    }
}